﻿using System;
using System.IO;
using System.Data;
using System.Windows;
using System.Collections;
using System.Windows.Input;
using System.ComponentModel;
using System.Windows.Controls;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.UI.Controls;
using Sinacor.Infra.UI.Controls.SmartClient;
using System.Collections.Generic;
using Sinacor.Infra.UI.Controls.SmartClient.Validation;
using Sinacor.UI.Bovespa.Alocacao.Presenter;
using Sinacor.UI.Bovespa.Clientes.View.SmartClient;
using Sinacor.UI.Bovespa.Clientes;
using Sinacor.UI.Bovespa.Ordens.View.SmartClient;
using System.Windows.Threading;

namespace Sinacor.UI.Bovespa.Alocacao.View.SmartClient
{
    public partial class EspecificacaoVendaSemCobertura : SinacorWindow, ICoberturaTermo, IVendaSemCobertura
    {
        #region Atributos
        private bool _operacaoCancelada = false;
        private bool _habilitaOperacoesVista = true;
        #endregion

        #region Construtor
        public EspecificacaoVendaSemCobertura()
        {
            this.Inicializar();
        }
        #endregion

        #region Presenter

        /// <summary>
        /// Venda sem Cobertura - Cobertura de Termo
        /// </summary>
        public Presenter.CoberturaTermo _presenter { get; set; }
        public Presenter.VendaSemCobertura _presenterVendaSemCobertura { get; set; }

        #endregion

        public void Inicializar()
        {
            InitializeComponent();

            this._presenter = new Presenter.CoberturaTermo(this);
            this._presenterVendaSemCobertura = new Presenter.VendaSemCobertura(this);
            this.tabitemCoberturaTermo.DataContext = this._presenter;
            this.tabitemVendasSemCobertura.DataContext = this._presenterVendaSemCobertura;

            this.dtgVendaSemCobertura.DataContext = this._presenterVendaSemCobertura;
            this.dtgOperacoesVista.NewItemType = typeof(Model.Operacao);
            this.dtgOperacoesTermo.NewItemType = typeof(Model.Operacao);
            this.dtgVendaSemCobertura.NewItemType = typeof(Model.VendaDescoberta);

            this.AfterInitialize += new RoutedEventHandler(EspecificacaoVendaSemCobertura_AfterInitialize);
        }

        private void EspecificacaoVendaSemCobertura_AfterInitialize(object sender, RoutedEventArgs e)
        {
            this._presenterVendaSemCobertura.Inicializar();
            this._presenter.Inicializar();
            this.PosicionarValoresPadrao();
            this.ControleOperacoesAlocacao(false);
        }

        #region ICoberturaTermoIVendaSemCobertura Members
        public void AtualizarBolsas()
        {
            this.cmbBolsa.UpdateTarget(SinacorComboBox.SelectedValueProperty);
            this.cmbBolsa.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
        }


        /// <summary>
        /// EA: Atualizar combobox de calendário de pregões, 
        ///     atribuir o item selecionado a data do movimento (Presenter.InformacoesMovimento.DataMovimento).
        /// </summary>
        public void AtualizarCalendarioCoberturaTermo()
        {
            this._presenter.Filtro.DataPregao = this._presenter.InformacoesMovimento.DataMovimento;
            this.cmbDataMovimento.UpdateTarget(SinacorComboBox.SelectedValueProperty);
            this.cmbDataMovimento.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
        }

        /// <summary>
        /// EA: Atualizar combobox de calendário de pregões, 
        ///     atribuir o item selecionado a data do movimento (Presenter.InformacoesMovimento.DataMovimento).
        /// </summary>
        public void AtualizarCalendarioVendaSemCobertura()
        {
            this.cmbDataPregao.UpdateTarget(SinacorComboBox.SelectedValueProperty);
            this.cmbDataPregao.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
        }

        public void AtualizarCarteiras()
        {
            this.cmbCarteiraCobertura.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
        }

        public void AtualizarIndicadores()
        {
            this.txtPercentualFinaciamentoCoberto.UpdateTarget(SinacorDecimalTextBox.ValueProperty);
            this.txtPercentualFinanciamento.UpdateTarget(SinacorDecimalTextBox.ValueProperty);
            this.txtQtdCobertura.UpdateTarget(SinacorDecimalTextBox.ValueProperty);
            this.txtQtdTermo.UpdateTarget(SinacorDecimalTextBox.ValueProperty);
            this.txtQtdTotalVista.UpdateTarget(SinacorDecimalTextBox.ValueProperty);
            this.cmbDataMovimento.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
            this.txtValorCobertura.UpdateTarget(SinacorDecimalTextBox.ValueProperty);
            this.txtValorTermo.UpdateTarget(SinacorDecimalTextBox.ValueProperty);
            this.txtValorTotalVista.UpdateTarget(SinacorDecimalTextBox.ValueProperty);

            //Task14250
            this.cmbDataPregao.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
        }

        public void AtualizarOperacoesTermo()
        {
            dtgOperacoesTermo.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }


        public void AtualizarVendasDescobertas()
        {
            // Deixar as linhas com alocacao automatica marcadas como editadas
            for (var i = 0; i < _presenterVendaSemCobertura.ListaVendasDescobertas.Count; i++)
            {
                if (_presenterVendaSemCobertura.ListaVendasDescobertas[i].AlocacaoCarteira219 != null ||
                    _presenterVendaSemCobertura.ListaVendasDescobertas[i].AlocacaoCarteira239 != null ||
                    _presenterVendaSemCobertura.ListaVendasDescobertas[i].AlocacaoCarteira274 != null ||
                    _presenterVendaSemCobertura.ListaVendasDescobertas[i].AlocacaoCarteira280 != null)
                    _presenterVendaSemCobertura.ListaVendasDescobertas[i] = _presenterVendaSemCobertura.ListaVendasDescobertas[i];
            }

            dtgVendaSemCobertura.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        public void AtualizarOperacoesVista()
        {
            dtgOperacoesVista.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        public void DesabilitarOperacoes()
        {
            _habilitaOperacoesVista = false;
            this.btnCancelar.IsEnabled = false;
            this.btnSalvar.IsEnabled = false;
        }

        public void HabilitarOperacoes()
        {
            _habilitaOperacoesVista = true;
            this.btnCancelar.IsEnabled = true;
            this.btnSalvar.IsEnabled = true;
        }

        public void InformarNenhumaVendaDescobertaEncontrada()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Alocacao.Message.PesquisaSemRetorno").ToString(), SinacorMessageBoxImage.Information);
        }

        public void InformarSucessoOperacao()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Alocacao.Message.SucessoOperacao").ToString(), SinacorMessageBoxImage.Information);
        }

        public void ProibirAcessoVendaUsuarioNaoOperador()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Alocacao.ExceptionMessage.UsuarioSemPermissao").ToString(), SinacorMessageBoxImage.Exclamation);
            base.Close();
        }

        public void ProibirAcessoCoberturaTermo()
        {
            this.tabitemCoberturaTermo.IsEnabled = false;
        }

        public void ProibirAcessoVendasSemCobertura()
        {
            this.tabitemVendasSemCobertura.IsEnabled = false;
        }


        /// <summary>
        /// Proibir o acesso à tela pois o usuário logado não é operador.
        /// </summary>
        public void ProibirAcessoUsuarioNaoOperador()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Alocacao.ExceptionMessage.UsuarioSemPermissao").ToString(), SinacorMessageBoxImage.Exclamation);
            base.Close();
        }

        public bool ConfirmaCancelamento()
        {
            _operacaoCancelada =
                SinacorMessageBox.Show(
                    FindResource("Bovespa.Alocacao.Message.ConfirmaOperacao").ToString(),
                    SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question
                ) == SinacorMessageBoxResult.Yes;

            if (_operacaoCancelada)
                this.ShowUserWaitingProcess();

            return _operacaoCancelada;
        }

        public bool ConfirmarCancelamento()
        {
            _operacaoCancelada =
                SinacorMessageBox.Show(
                    FindResource("Bovespa.Alocacao.Message.ConfirmaOperacao").ToString(),
                    SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question
                ) == SinacorMessageBoxResult.Yes;

            if (_operacaoCancelada)
                this.ShowUserWaitingProcess();

            return _operacaoCancelada;
        }


        public bool ConfirmarUnificacaoLotes(Model.VendaDescoberta vendaDescoberta)
        {
            _operacaoCancelada =
               SinacorMessageBox.Show(
                   FindResource("Bovespa.Alocacao.Message.ConfirmaUniaoLotes").ToString(),
                   SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question
               ) == SinacorMessageBoxResult.Yes;

            if (_operacaoCancelada)
                this.ShowUserWaitingProcess();

            return _operacaoCancelada;
        }
        #endregion

        #region Métodos privados CoberturaTermo

        private void btnCliente_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            PesquisaClientes pesquisaClientes = new PesquisaClientes();

            Clientes.Model.PesquisaCliente filtroPesq = new Sinacor.UI.Bovespa.Clientes.Model.PesquisaCliente() { Apelido = txtCliente.Text };
            pesquisaClientes.CarregaParametros(Sinacor.UI.Bovespa.Clientes.Model.Enum.JanelaChamada.CasamentoManual, filtroPesq);
            pesquisaClientes.Owner = this;
            pesquisaClientes.SetMenuHeader("Bovespa.Clientes.Label.PesquisaCliente");
            pesquisaClientes.ShowDialog();

            if (pesquisaClientes.PesquisaClienteModel.Codigo > 0)
            {
                this._presenter.Filtro.ApelidoCliente = pesquisaClientes.PesquisaClienteModel.Apelido;
                txtCliente.UpdateTarget(SinacorTextBox.TextProperty);
            }
        }

        private void btnPesquisaAtivo_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            this.ShowUserWaitingProcess();
            Ordens.Model.Titulo modelTitulo = new Ordens.Model.Titulo();
            modelTitulo.Codigo = txtAtivo.Text;

            PesquisaTitulo pesquisaTitulo = new PesquisaTitulo();
            pesquisaTitulo.CarregarParametros(modelTitulo, null);
            pesquisaTitulo.Owner = this;
            pesquisaTitulo.SetMenuHeader("Bovespa.Titulo.Label.PesquisaTitulos");
            pesquisaTitulo.ShowDialog();

            if (pesquisaTitulo.TituloEscolhido != null)
            {
                this._presenter.Filtro.Ativo = pesquisaTitulo.TituloEscolhido.Codigo;
                txtAtivo.UpdateTarget(SinacorTextBox.TextProperty);
            }

            this.HideUserWaitingProcess();
        }

        private void menuCoberturaAutomatica_Click(object sender, RoutedEventArgs e)
        {
            this.ShowUserWaitingProcess();
            this._presenter.ProcessarCoberturaAutomatica();
            this._presenter.CalcularIndicadores();
            this.AtualizarOperacoesVista();
            this.AtualizarIndicadores();
            this.HideUserWaitingProcess();
        }

        private void btnNovaPesquisa_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            this.ShowUserWaitingProcess();
            this.ClearChanges();
            this.ClearServiceErrors();
            this.PosicionarValoresPadrao();
            this.HideUserWaitingProcess();
        }

        private void cmbCarteiraCobertura_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            //-- Para ordem do tipo Financiamento, 
            SinacorComboBox combo = (SinacorComboBox)sender;
            if (combo.SelectedItem != null &&
                ((EnumWrapper<Model.Enum.CarteiraCoberturaTermo>)combo.SelectedItem).Value == Model.Enum.CarteiraCoberturaTermo.Carteira258)
            {
                this._presenter.Filtro.Carteira = Sinacor.UI.Bovespa.Alocacao.Model.Enum.CarteiraCoberturaTermo.Carteira258;
            }

            if (((SinacorComboBox)sender).SelectedItem != null &&
                ((EnumWrapper<Model.Enum.CarteiraCoberturaTermo>)((SinacorComboBox)sender).SelectedItem).Value == Model.Enum.CarteiraCoberturaTermo.Carteira268)
            {
                this._presenter.Filtro.Carteira = Sinacor.UI.Bovespa.Alocacao.Model.Enum.CarteiraCoberturaTermo.Carteira268;
            }
        }

        private void txtQuantidade_Validating(object sender, ValidatingEventArgs e)
        {
            ValidationResult result = ValidationResult.ValidResult;

            if (e.Value != null)
            {
                Sinacor.UI.Bovespa.Alocacao.Model.Operacao operacao = new Sinacor.UI.Bovespa.Alocacao.Model.Operacao();
                operacao.QuantidadeCarteira268 = (decimal?)e.Value;

                if (this._presenter.ValidarQtdeCoberturaQtdeEspecificada(operacao))
                {
                    if (this._presenter.ValidarQtdeCoberturaQtdeTermo())
                    {
                        //Atribuir o retorno a propriedade ValorTotalCobertura268 da Model corrente
                        operacao.ValorTotalCarteira268 = this._presenter.CalcularValorTotalCobertura(operacao);
                        this._presenter.CalcularIndicadores();
                    }
                    else
                        result = new ValidationResult(false, "Bovespa.Alocacao.Message.QuantidadeIncompativelComTermo");
                }
                else
                    result = new ValidationResult(false, "Bovespa.Alocacao.Message.QuantidadeIncompativelComVista");
            }

            e.Result = result;
        }

        private void menuCoberturaAutomatica_Loaded(object sender, RoutedEventArgs e)
        {
            SinacorContextMenuItem mnuCoberturaAutomatica = (SinacorContextMenuItem)sender;
            mnuCoberturaAutomatica.IsEnabled = _habilitaOperacoesVista;
        }

        private void dtgOperacoesVista_SavingAll(object sender, CancelItemsEventArgs e)
        {
            Salvar();

            if (this.HasErrors)
                e.Cancel = true;
        }



        /// <summary>
        /// Ao ser acionado, executa rotina de pesquisa de Operações de Venda sem Cobertura,
        /// de acordo com os filtros fornecidos pelo usuário
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        /// <param name="clickCount"></param>
        private void btnPesquisar_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            this.ShowUserWaitingProcess();
            this.ClearServiceErrors();
            this.AtivarValidacoesCampos(true);

            cmbDataMovimento.Validate();
            txtCliente.Validate();
            txtAtivo.Validate();
            cmbBolsa.Validate();

            if (!HasErrors)
            {
                dtgOperacoesVista.IsEnabled = false;
                dtgOperacoesTermo.IsEnabled = false;

                this._presenter.ConsultarOperacoesVista();
                this._presenter.ConsultarOperacoesTermo();
                this._presenter.CalcularIndicadores();

                this.dtgOperacoesVista.Columns["Usuario"].Visible = !this._presenter.Filtro.CustodiaCorretora;
                this.dtgOperacoesVista.Columns["Cliente"].Visible = !this._presenter.Filtro.CustodiaCorretora;
                this.dtgOperacoesVista.Columns["DVCliente"].Visible = !this._presenter.Filtro.CustodiaCorretora;

                if (!(this.dtgOperacoesVista.HasItems || this.dtgOperacoesTermo.HasItems))
                {
                    ShowError("Bovespa.Alocacao.Message.PesquisaSemRetorno");
                }
                else
                {
                    dtgOperacoesVista.IsEnabled = true;
                    dtgOperacoesTermo.IsEnabled = true;
                }

                this.dtgOperacoesVista.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
            }

            this.HideUserWaitingProcess();
        }

        private void PosicionarValoresPadrao()
        {
            this.AtivarValidacoesCampos(false);

            _presenter.Filtro = new Sinacor.UI.Bovespa.Alocacao.Model.Parameter.FiltroCoberturaTermo();
            _presenter.Filtro.DataPregao = this._presenter.InformacoesMovimento.DataMovimento;
            _presenter.Filtro.Carteira = Sinacor.UI.Bovespa.Alocacao.Model.Enum.CarteiraCoberturaTermo.Carteira268;
            _presenter.Filtro.Mercados = new List<Sinacor.UI.Bovespa.Alocacao.Model.Enum.TipoMercado>();
            _presenter.Indicadores = new Sinacor.UI.Bovespa.Alocacao.Model.DadosSumarizadosCoberturaTermo();
            _presenter.OperacoesTermo = new ModelCollection<Sinacor.UI.Bovespa.Alocacao.Model.Operacao>();
            _presenter.OperacoesVista = new ModelCollection<Sinacor.UI.Bovespa.Alocacao.Model.Operacao>();

            _presenterVendaSemCobertura.Filtro = new Sinacor.UI.Bovespa.Alocacao.Model.Parameter.FiltroVendaDescoberta();
            _presenterVendaSemCobertura.Filtro.DataPregao = this._presenterVendaSemCobertura.InformacoesMovimento.DataMovimento;

            if (_presenter.Preferencias != null && !string.IsNullOrEmpty(_presenter.Preferencias.Bolsa))
            {
                int codBolsa = int.Parse(_presenter.Preferencias.Bolsa);
                _presenter.Filtro.CodigoBolsa = codBolsa;
                this.cmbBolsa.SelectedValue = codBolsa;
            }
            else
                cmbBolsa.SelectedIndex = -1;

            this.cmbDataMovimento.SelectedValue = _presenter.Filtro.DataPregao;

            //TaskDesev 14250
            AtualizarCalendarioVendaSemCobertura();
            //this.cmbDataPregao.SelectedValue = _presenterVendaSemCobertura.Filtro.DataPregao;
            //

            this.ckbAlocacaoAutomatica.IsChecked = true;

            this.cmbCarteiraCobertura.SelectedIndex = 0;
            this.DesabilitarOperacoes();

            this.AtualizarCamposPesquisa();
            this.AtualizarCalendarioCoberturaTermo();
            this.AtualizarCarteiras();
            this.AtualizarBolsas();
            this.AtualizarIndicadores();
            this.AtualizarOperacoesVista();
            this.AtualizarOperacoesTermo();
        }

        private void AtivarValidacoesCampos(bool valor)
        {
            cmbDataMovimento.IsRequired = valor;
            txtCliente.IsRequired = valor;
            txtAtivo.IsRequired = valor;
            cmbBolsa.IsRequired = valor;
        }

        private void AtualizarCamposPesquisa()
        {
            txtAtivo.UpdateTarget(SinacorTextBox.TextProperty);
            txtCliente.UpdateTarget(SinacorTextBox.TextProperty);
            ckbCustodiaCorretora.UpdateTarget(SinacorCheckBox.IsCheckedProperty);
            //Task14250
            txtAtivoAlocacao.UpdateTarget(SinacorTextBox.TextProperty);
            txtClienteAlocacao.UpdateTarget(SinacorTextBox.TextProperty);
            ckbAlocacaoAutomatica.UpdateTarget(SinacorCheckBox.IsCheckedProperty);
            //
        }

        private void btnSalvar_Click(object sender, RoutedEventArgs e)
        {
            if (dtgOperacoesVista.IsUpdating)
                dtgOperacoesVista.EndUpdate();

            //SalvarVenda();
            dtgVendaSemCobertura.SaveAll();
            ControleOperacoesAlocacao(false);
        }

        private void Salvar()
        {
            this.ClearServiceErrors();
            this.ShowUserWaitingProcess();
            _presenter.CobrirOperacoesTermo();

            ClearChanges();
            this.HideUserWaitingProcess();
        }


        private void Cancelar()
        {
            _presenter.Cancelar();

            if (_operacaoCancelada)
            {
                this.ClearServiceErrors();
                ClearChanges();
            }

            this.HideUserWaitingProcess();
        }

        private void btnCancelar_Click(object sender, RoutedEventArgs e)
        {
            Cancelar();
        }

        private void dtgOperacoesVista_UndoingAll(object sender, CancelItemsEventArgs e)
        {
            Cancelar();
            e.Cancel = !_operacaoCancelada;
        }


        #endregion

        #region Métodos privados VendaSemCobertura

        private T ObterControleGrid<T>(SinacorDataGrid grid, string id) where T : System.Windows.DependencyObject
        {
            return (T)ControlHelper.FindChild(grid.GetEditRow(), id);
        }

        private void SalvarVenda()
        {
            this.ShowUserWaitingProcess();
            this.ClearServiceErrors();

            if (_presenterVendaSemCobertura.Salvar())
                _presenterVendaSemCobertura.ConsultarVendasDescobertas();

            this.HideUserWaitingProcess();
        }

        private void CancelarVenda()
        {
            //task 14250
            _presenterVendaSemCobertura.Cancelar();
            //
            if (_operacaoCancelada)
            {
                this.ClearServiceErrors();
                ClearChanges();
            }

            this.HideUserWaitingProcess();
        }

        private void btnPesquisaAtivosAlocacao_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            this.ShowUserWaitingProcess();
            Ordens.Model.Titulo modelTitulo = new Ordens.Model.Titulo();
            modelTitulo.Codigo = txtAtivoAlocacao.Text;
            modelTitulo.Mercado = null;
            modelTitulo.DataPregao = ((Model.Calendario)cmbDataMovimento.SelectedItem).DataPregao;

            PesquisaTitulo pesquisaTitulo = new PesquisaTitulo();
            pesquisaTitulo.CarregarParametros(modelTitulo, null);
            pesquisaTitulo.Owner = this;
            pesquisaTitulo.SetMenuHeader("Bovespa.Titulo.Label.PesquisaTitulos");
            pesquisaTitulo.ShowDialog();

            if (pesquisaTitulo.TituloEscolhido != null)
            {
                this._presenterVendaSemCobertura.Filtro.Ativo = pesquisaTitulo.TituloEscolhido.Codigo;
                txtAtivoAlocacao.UpdateTarget(SinacorTextBox.TextProperty);
            }

            this.HideUserWaitingProcess();
        }

        private void btnClienteAlocacao_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            PesquisaClientes pesquisaClientes = new PesquisaClientes();

            Clientes.Model.PesquisaCliente filtroPesq = new Sinacor.UI.Bovespa.Clientes.Model.PesquisaCliente() { Apelido = txtClienteAlocacao.Text };
            pesquisaClientes.CarregaParametros(Sinacor.UI.Bovespa.Clientes.Model.Enum.JanelaChamada.CasamentoManual, filtroPesq);
            pesquisaClientes.Owner = this;
            pesquisaClientes.SetMenuHeader("Bovespa.Alocacao.Label.PesquisaCliente");
            pesquisaClientes.ShowDialog();

            if (pesquisaClientes.PesquisaClienteModel.Codigo > 0)
            {
                this._presenterVendaSemCobertura.Filtro.ApelidoCliente = pesquisaClientes.PesquisaClienteModel.Apelido;
                txtClienteAlocacao.UpdateTarget(SinacorTextBox.TextProperty);
            }
        }

        private void btnPesquisarAlocacao_Click(object sender, RoutedEventArgs e)
        {
            this.ShowUserWaitingProcess();
            this.ClearServiceErrors();

            this.AtivarValidacoesCampos(true);

            if (ckbAlocacaoAutomatica.IsChecked == true)
            {
                _presenterVendaSemCobertura.Filtro.SugerirAlocacaoAutomatica = true;
            }
            else
            {
                _presenterVendaSemCobertura.Filtro.SugerirAlocacaoAutomatica = false;
            }
            dtgOperacoesVista.IsEnabled = false;
            dtgOperacoesTermo.IsEnabled = false;

            this._presenterVendaSemCobertura.ConsultarVendasDescobertas();

            if (dtgVendaSemCobertura.HasItems && ckbAlocacaoAutomatica.IsChecked == true)
            {
                ControleOperacoesAlocacao(true);
            }

            this.HideUserWaitingProcess();
        }

        private void btnNovaPesquisaAlocacao_Click(object sender, RoutedEventArgs e)
        {
            ControleOperacoesAlocacao(false);
            this.ShowUserWaitingProcess();
            this.ClearChanges();
            this.ClearServiceErrors();
            _presenterVendaSemCobertura.Filtro = new Sinacor.UI.Bovespa.Alocacao.Model.Parameter.FiltroVendaDescoberta();
            _presenterVendaSemCobertura.Filtro.DataPregao = this._presenterVendaSemCobertura.InformacoesMovimento.DataMovimento;
            this.PosicionarValoresPadrao();
            this.HideUserWaitingProcess();

            _presenterVendaSemCobertura.ListaVendasDescobertas = new ModelCollection<Sinacor.UI.Bovespa.Alocacao.Model.VendaDescoberta>();
            AtualizarVendasDescobertas();
        }

        private void btnCancelarAlocacao_Click(object sender, RoutedEventArgs e)
        {
            dtgVendaSemCobertura.CancelUpdate();
            _presenterVendaSemCobertura.ConsultarVendasDescobertas();
            ControleOperacoesAlocacao(false);
        }

        private void btnSalvarAlocacao_Click(object sender, RoutedEventArgs e)
        {
            if (dtgVendaSemCobertura.IsInserting)
            {
                dtgVendaSemCobertura.EndInsert();
            }
            if (dtgVendaSemCobertura.IsUpdating)
            {
                dtgVendaSemCobertura.EndUpdate();
            }
            SalvarVenda();
        }

        #endregion

        private void dtgVendaSemCobertura_SavingAll(object sender, CancelItemsEventArgs e)
        {
            SalvarVenda();
            e.Cancel = true;
            ControleOperacoesAlocacao(false);
        }

        private void dtgVendaSemCobertura_CancelingUpdate(object sender, CancelItemEventArgs e)
        {
            if (!((SinacorDataGrid)sender).SelectionChanging)
            {
                e.Handled = true;
                e.Cancel = true;
                dtgVendaSemCobertura.EndUpdate();
                CancelarVenda();
                ControleOperacoesAlocacao(false);
            }
        }

        private void dtgVendaSemCobertura_CurrentCellChanged(object sender, CurrentCellChangedEventArgs e)
        {
            if (dtgVendaSemCobertura.IsEditing)
            {
                Model.VendaDescoberta currentModel = ((Model.VendaDescoberta)dtgVendaSemCobertura.EditItem);

                currentModel.QuantidadeNaoAlocada = currentModel.QuantidadeDescoberta - (
                    currentModel.AlocacaoCarteira219.GetValueOrDefault() +
                    currentModel.AlocacaoCarteira239.GetValueOrDefault() +
                    currentModel.AlocacaoCarteira274.GetValueOrDefault() +
                    currentModel.AlocacaoCarteira280.GetValueOrDefault());
            }
        }

        private void dtgVendaSemCobertura_UpdateBegun(object sender, ItemEventArgs e)
        {
            ControleOperacoesAlocacao(true);
            if (e.OriginalSource is SinacorDataGrid)
            {
                if (((Model.VendaDescoberta)this.dtgVendaSemCobertura.EditItem).PosicaoCarteira219 == 0)
                {                   
                    ObterControleGrid<SinacorDecimalTextBox>((SinacorDataGrid)sender, "TxtCMargem219Alocacao").IsEnabled = false;
                }

                if (((Model.VendaDescoberta)this.dtgVendaSemCobertura.EditItem).PosicaoCarteira239 == 0)
                {
                    ObterControleGrid<SinacorDecimalTextBox>((SinacorDataGrid)sender, "TxtGarantia239Alocacao").IsEnabled = false;
                }

                if (((Model.VendaDescoberta)this.dtgVendaSemCobertura.EditItem).PosicaoCarteira274 == 0)
                {
                    ObterControleGrid<SinacorDecimalTextBox>((SinacorDataGrid)sender, "TxtOpcao274Alocacao").IsEnabled = false;
                }

                if (((Model.VendaDescoberta)this.dtgVendaSemCobertura.EditItem).PosicaoCarteira280 == 0)
                {
                    ObterControleGrid<SinacorDecimalTextBox>((SinacorDataGrid)sender, "TxtEmprAcoes280Alocacao").IsEnabled = false;
                }
            }
        }

        private void ControleOperacoesAlocacao(bool habilita)
        {
            this.btnSalvarAlocacao.IsEnabled = habilita;
            this.btnCancelarAlocacao.IsEnabled = habilita;
        }
    }
}
